package org.stock.agent.service;

import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.ai.chat.memory.MessageWindowChatMemory;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.openai.OpenAiChatOptions;
import org.springframework.stereotype.Service;
import org.stock.agent.model.AnalysisResult;
import org.stock.agent.tools.StockTools;

@Service
@Slf4j
public class TechnicalAnalyst {

    private final ChatClient openAiChatClient;
    private final ChatModel chatModel;
    private final StockTools stockTools;

    public TechnicalAnalyst(ChatModel chatModel, StockTools stockTools) {

        this.chatModel = chatModel;
        this.stockTools = stockTools;

        // 构造时，可以设置 ChatClient 的参数
        // {@link org.springframework.ai.chat.client.ChatClient};
        this.openAiChatClient = ChatClient.builder(chatModel)
                // 实现 Chat Memory 的 Advisor
                // 在使用 Chat Memory 时，需要指定对话 ID，以便 Spring AI 处理上下文。
                .defaultAdvisors(
                        MessageChatMemoryAdvisor.builder(MessageWindowChatMemory.builder().build()).build()
                )
                // 实现 Logger 的 Advisor
                .defaultAdvisors(
                        new SimpleLoggerAdvisor()
                )
                // 设置 ChatClient 中 ChatModel 的 Options 参数
                .defaultOptions(
                        OpenAiChatOptions.builder()
                                .topP(0.7)
                                .build()
                )
                .build();
    }
    
    public AnalysisResult analyzeTechnical(String symbol) {
        String prompt = """
            作为价值投资技术分析师，请从长期价值投资的角度分析{symbol}股票的技术面状况，重点评估当前是否为合适的买入时机。
            
            你需要使用以下工具获取相关信息进行分析：
            1. 使用getStockBasicInfo获取股票基础信息
            2. 使用getLatestTransaction获取最近的实时交易数据，了解当前价格和成交量情况
            3. 使用getHistoricalMA获取历史移动平均线数据（5日、10日、20日、60日、120日、250日），分析均线排列和多空趋势
            4. 使用getHistoricalMACD获取MACD指标数据，分析趋势强度和买卖信号
            5. 使用getHistoricalKDJ获取KDJ指标数据，分析超买超卖情况和短期转折点
            6. 使用getHistoricalBOLL获取布林带指标数据，分析价格波动区间和突破信号
            7. 使用getCapitalFlow获取资金流向数据，分析主力资金动向
            8. 使用getCurrentTime获取当前时间，确保分析的时效性
            9. 使用getRecentDividends获取近年分红数据，分析分红除权对技术面的影响
            10. 使用getRecentOfferings获取近年增发数据，分析增发对技术面的影响
            11. 使用getRestrictedStockUnlock获取解禁限售数据，分析解禁对技术面的潜在影响
            
            请从以下几个维度进行深入分析：
            1. 趋势分析：
               - 价格长期趋势（上升、下降或震荡），价值投资者更关注长期上升趋势或从低位开始的上升趋势
               - 趋势强度评估，寻找趋势刚刚开始或正在加强的时机
               - 趋势持续性和可能的转折点，避免在趋势末期买入
               
            2. 均线系统分析：
               - 短期、中期、长期均线排列情况，寻找多头排列且股价在均线上方的情况
               - 均线支撑和阻力作用，评估关键支撑位的有效性
               - 均线交叉信号分析，特别是长期均线的金叉信号
               
            3. 技术指标分析：
               - MACD指标的背离和交叉信号，寻找底部背离和金叉信号
               - KDJ指标的超买超卖区域分析，寻找超卖区域的反弹机会
               - RSI指标的强弱判断，重点关注30以下的超卖区域
               - 布林带的开口和价格位置分析，寻找价格触及下轨后的反弹机会
               
            4. 成交量分析：
               - 成交量与价格的配合关系，寻找缩量下跌或放量上涨的信号
               - 放量和缩量的意义解读，评估市场参与者的情绪
               - 资金流向与价格趋势的一致性，主力资金流入是重要参考
               
            5. 支撑阻力分析：
               - 关键支撑位和阻力位识别，评估当前价格位置
               - 历史价位的支撑阻力作用，寻找历史底部区域
               - 突破的有效性判断，确认是否为有效突破
               
            6. 形态分析：
               - 经典技术形态识别（如头肩底、双底等底部形态）
               - K线组合形态分析，寻找见底或启动信号
               - 持续形态和反转形态判断，重点关注反转形态
               
            7. 时间周期分析：
               - 不同时间周期的趋势一致性，寻找多周期共振的买入机会
               - 时间窗口和周期共振分析，评估关键时间点
               - 长期价值投资视角下的关键时间节点预测
            
            结合以上分析，判断当前是否为适合长期价值投资者买入该股票的技术时机，
            给出适合买入的可能性百分比（0-100）和详细的技术面理由。
            
            特别注意：
            - 如果发现技术信号冲突，请在分析中说明并给出综合判断
            - 结合成交量和资金流向验证技术信号的有效性
            - 考虑市场整体环境对个股技术面的影响
            - 识别潜在的风险点和关键观察信号
            - 重点关注超卖区域、底部形态、均线支撑等价值投资买入信号
            
            请严格按照以下JSON格式返回结果：
            {
              "analystRole": "价值投资技术分析师",
              "symbol": "{symbol}",
              "probability": [0-100之间的数值，表示当前技术面适合价值投资者买入的概率],
              "reasoning": "[详细的技术分析理由，至少包含400字，涵盖上述分析维度，特别说明是否适合价值投资者买入]",
              "confidenceLevel": "[高/中/低，基于信号一致性和市场环境确定]"
            }
            """;

        AnalysisResult entity = openAiChatClient.prompt(prompt + "symbol是" + symbol)
                //.user(userSpec -> userSpec.text(prompt).param("symbol", symbol))
                .tools(stockTools)
                .call()
                .entity(AnalysisResult.class);
        log.info("价值投资技术分析师: {}", entity.getReasoning());
        return entity;
    }
}